VkPhysicalDeviceFeatures 全字段详解
· 阅读需 7 分钟
VkPhysicalDeviceFeatures
全字段详解
字段名 | 中文解释 | 功能描述 | 建议启用 |
---|---|---|---|
robustBufferAccess | 可靠缓冲访问 | 防止越界读取 buffer(安全性高,性能略降) | ✅ 建议启用 |
fullDrawIndexUint32 | 完整 32 位索引 | 支持 uint32_t 顶点索引(> 65535) | ✅ 建议启用 |
imageCubeArray | 立方体贴图数组 | 支持 cube[] 类型纹理数组(天空盒、PBR) | ✅ 常用 |
independentBlend | 独立混合 | framebuffer 中每个颜色附件独立设置混合参数 | ✅ 多渲染目标 |
geometryShader | 几何着色器 | 支持 geometry shader 阶段 | ✅ 若用 |
tessellationShader | 曲面细分着色器 | 支持 tessellation shader 阶段 | ✅ 若用 |
sampleRateShading | 每采样着色 | 支持 MSAA 中 per-sample 着色 | ✅ 若做 MSAA |
dualSrcBlend | 双源混合 | Fragment Shader 可输出两种颜色供混合使用 | ⚠️ 特殊需求 |
logicOp | 逻辑操作混合 | 支持逻辑运算混合(AND, OR, XOR) | ❌ 少用 |
multiDrawIndirect | 多重绘制(间接) | vkCmdDrawIndirect() 可一次提交多个 draw | ✅ 批处理优化 |
drawIndirectFirstInstance | 支持 firstInstance 参数 | vkCmdDrawIndirect() 支持 firstInstance > 0 | ✅ 现代渲染常用 |
depthClamp | 深度裁剪 | 替代剪裁 -1~1 范围(保持 z 方向顶点) | ✅ 阴影场景常用 |
depthBiasClamp | 深度偏移裁剪 | 防止 bias 偏移过多导致错误 | ✅ 阴影贴图常用 |
fillModeNonSolid | 非填充模式 | 支持线框/点渲染(wireframe/points) | ✅ 调试用 |
depthBounds | 深度边界测试 | 允许指定深度范围进行测试(优化) | ⚠️ 受限支持 |
wideLines | 宽线支持 | 支持 >1 像素的线条宽度 | ⚠️ 移动端大多不支持 |
largePoints | 大点支持 | 点精灵支持大尺寸 | ✅ 少量使用 |
alphaToOne | alphaToOne | 支持将 fragment alpha 强制设置为 1.0 | ⚠️ 透明排序时可用 |
multiViewport | 多视口 | 支持一次绘制多个视口(VR、多屏) | ✅ 多摄像头渲染 |
samplerAnisotropy | 各向异性过滤 | 提高纹理在斜角处的清晰度 | ✅ 强烈建议启用 |
textureCompressionETC2 | ETC2 压缩纹理 | 用于移动平台节省显存 | ✅ 移动端强烈建议启用 |
textureCompressionASTC_LDR | ASTC 压缩纹理 | 高质量压缩纹理格式 | ✅ 若资源用 ASTC |
textureCompressionBC | BC压缩纹理 | 桌面压缩格式(DXT1~5) | ✅ 桌面平台建议启用 |
occlusionQueryPrecise | 精确遮挡查询 | 更高精度的 vkCmdBeginQuery() | ⚠️ 若做遮挡剔除 |
pipelineStatisticsQuery | 管线统计查询 | 可统计 shader、vertices 等数据 | ✅ 性能分析时用 |
vertexPipelineStoresAndAtomics | 顶点阶段写入/原子 | 支持在顶点阶段写 SSBO | ✅ 特殊用途如粒子模拟 |
fragmentStoresAndAtomics | 片段阶段写入/原子 | 允许 fragment shader 中对 buffer/image 原子操作 | ✅ 做累加/排序等用 |
shaderTessellationAndGeometryPointSize | Tess/Geo 支持点大小 | 是否能在 GS/Tess 中设置 gl_PointSize | ⚠️ 特定图元需 |
shaderImageGatherExtended | 扩展 imageGather | 支持更复杂的纹理采样 gather 操作 | ✅ 多数现代 GPU 支持 |
shaderStorageImageExtendedFormats | image 格式扩展 | 支持非标准格式的 storage image | ✅ 若用 float16/uint |
shaderStorageImageMultisample | 多采样 image 支持 | 支持对 multisample image 的读写 | ✅ 做 MSAA resolve shader 时必需 |
shaderStorageImageReadWithoutFormat | 无格式读取 image | 读 storage image 不需指定格式 | ✅ 更灵活 |
shaderStorageImageWriteWithoutFormat | 无格式写入 image | 写 storage image 不需指定格式 | ✅ 若写入 raw data |
shaderUniformBufferArrayDynamicIndexing | 动态索引 UBO 数组 | Shader 支持 runtime 动态访问 uniform 数组 | ✅ 常用 |
shaderSampledImageArrayDynamicIndexing | 动态索引 Texture 数组 | Shader 支持 runtime 动态访问纹理数组 | ✅ 常用 |
shaderStorageBufferArrayDynamicIndexing | 动态索引 SSBO 数组 | Shader 支持 runtime 动态访问 storage buffer 数组 | ✅ 常用 |
shaderStorageImageArrayDynamicIndexing | 动态索引 image 数组 | Shader 支持 runtime 动态访问 image 数组 | ✅ 常用 |
shaderClipDistance | 支持 clip distance | 用 gl_ClipDistance 实现自定义裁剪 | ✅ 特效需要 |
shaderCullDistance | 支持 cull distance | 提前剔除片段(更省资源) | ✅ 多用于优化 |
shaderFloat64 | double 精度 float | 支持 64 位 float | ⚠️ 少数场合用(科学计算) |
shaderInt64 | 64 位整数 | 支持 long 类型 int | ✅ 若 GPU 计算需要 |
shaderInt16 | 16 位整数 | 支持短整数(需 Vulkan 1.1 或扩展) | ✅ 移动端节省带宽 |
shaderResourceResidency | 资源驻留控制 | 用于 bindless resource 管理 | ⚠️ 仅 NVIDIA 特性 |
shaderResourceMinLod | 最小 LOD 控制 | 更细粒度的 mip 控制 | ✅ 特效优化 |
sparseBinding | 稀疏资源绑定 | 支持虚拟贴图(虚拟内存分页) | ⚠️ 高级用途 |
sparseResidencyBuffer | 稀疏 Buffer | 支持虚拟化 buffer 内存 | ⚠️ 少数应用 |
sparseResidencyImage2D/3D | 稀疏图像 | 虚拟贴图支持 | ⚠️ 高级虚拟纹理系统 |
sparseResidencyAliased | 稀疏别名 | 多个资源共享内存页 | ⚠️ 专业图形系统用 |
variableMultisampleRate | 可变 MSAA | 每个子通道可以有不同的采样率 | ⚠️ 特定场景 |
inheritedQueries | 继承查询支持 | Secondary Command Buffer 继承 query | ✅ 渲染统计需求 |
📚 示例:开启特性
//打印支持的特性
VkPhysicalDeviceFeatures features;
vkGetPhysicalDeviceFeatures(physicalDevice, &features);
if (features.samplerAnisotropy)
std::cout << "支持各向异性过滤!" << std::endl;
if (features.geometryShader)
std::cout << "支持 Geometry Shader!" << std::endl;
//开启特性
VkPhysicalDeviceFeatures enabled{};
enabled.samplerAnisotropy = VK_TRUE;
enabled.multiDrawIndirect = VK_TRUE;
VkDeviceCreateInfo createInfo{};
createInfo.pEnabledFeatures = &enabled;
vkCreateDevice(physicalDevice, &createInfo, nullptr, &device);